#include "drivers.h"

static const unsigned char map[256] =
{
    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 253, 255,255, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
    255, 255, 255, 255, 255, 255, 255, 255, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 62, 255, 255, 255, 63,
    52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 255, 255, 255, 254, 255, 255, 255, 0, 1, 2, 3, 4, 5, 6,
    7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 255, 255, 255, 255, 255,
    255, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
    49, 50, 51, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255
};

void drivers_init(void)
{
    MPU6050_I2C_Init();
    rf_module_init();
    //flash_init();
}

void os_delay_ms(uint16_t ms)
{
    OS_ERR err;
    OSTimeDlyHMSM(0, 0, 0, ms, OS_OPT_TIME_DLY, &err);
}

void os_delay(uint16_t s)
{
    OS_ERR err;
    OSTimeDlyHMSM(0, 0, s, 0, OS_OPT_TIME_DLY, &err);
}

void os_delay_min(uint16_t min)
{
    OS_ERR err;
    OSTimeDlyHMSM(0, min, 0, 0, OS_OPT_TIME_DLY, &err);
}

__asm void SystemReset(void)
{
    MOV R0, #1           //; 
    MSR FAULTMASK, R0    //; 清除FAULTMASK 禁止一切中断产生
    LDR R0, =0xE000ED0C  //;
    LDR R1, =0x05FA0004  //; 
    STR R1, [R0]         //; 系统软件复位   

deadloop
    B deadloop        //; 死循环使程序运行不到下面的代码
}

void software_reboot(void)
{
    iFlash_set_restart_flag(TRUE);
    SystemReset();
}

int base64Decode(uint8_t *out, char *in)
{
    unsigned long t, x, y, z;
    unsigned char c;
    int g = 3;

    for (x = y = z = t = 0; in[x] != 0;) {
        c = map[in[x++]];
        if (c == 255)
            return -1;
        if (c == 253)
            continue;
        if (c == 254) {
            c = 0;
            g--;
        }
        t = (t<<6)|c;
        if (++y == 4) {
            out[z++] = (unsigned char)((t>>16)&255);
            if (g > 1)
                out[z++] = (unsigned char)((t>>8)&255);
            if (g > 2)
                out[z++] = (unsigned char)(t&255);
            y = t = 0;
        }
    }
    return z;
}
